package edu.yonsei.iwb.smarttv;

import edu.yonsei.iwb.smarttv.result.NERResults;
import edu.yonsei.iwb.smarttv.result.OntSearchResults;
import com.hp.hpl.jena.graph.Graph;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.rdf.model.Resource;
import edu.yonsei.iwb.smarttv.querygraph.MSTGenerateException;
import edu.yonsei.iwb.smarttv.result.SearchResultSet;
import java.util.Vector;

/**
 * SMART TV 환경에서 개체 식별 및 검색을 위한 최상위 인터페이스
 * 
 * @author 이명진
 * @version 1.0, 2011.9.8
 */
public interface LocalOntologySearchInterface {

//    /**
//     * 온톨로지 검색의 수행 결과로부터 재질의를 위해 SPARQL 구문을 이용하여 그래프 형태의 인터페이스를 제공하기 위한 메소드
//     *
//     * @param sparql 그래프 객체를 얻기 위한 SPARQL 구분
//     * @return 매개변수로 전달된 SPARQL이 담고 있는 트리플을 Jena의 Graph 인퍼테이스로 반환
//     */
    public Vector<Graph> getGraph(String sparql);
//    
//    /**
//     * 온톨로지 검색의 수행 결과로부터 재질의를 위해 Jena Query를 이용하여 그래프 형태의 인터페이스를 제공하기 위한 메소드
//     *
//     * @param query 그래프 객체를 얻기 위한 Jena Qeury
//     * @return 매개변수로 전달된 SPARQL이 담고 있는 트리플을 Jena의 Graph 인퍼테이스로 반환
//     */    
    public Vector<Graph> getGraph(Query query);    
//
//    /**
//     * 시작 객체와 끝객체를 지정하여 두 개체를 연결하는 그래프를 반환하는 메소드
//     *
//     * @param startObejct 그래프 인터페이스를 얻기 위한 첫 번째 개체로써 문자열에 대해 개체 식별을 수행한 후 그래프 결과 반환
//     * @param endObject 그래프 인터페이스를 얻기 위한 두 번째 개체로써 문자열에 대해 개체 식별을 수행한 후 그래프 결과 반환
//     * @return 두 개체를 잇는 트리플을 Jena의 Graph 인터페이스로 반환
//     */
//    public Graph getGraph(String startObejct, String endObject);
//
//    /**
//     * 시작 객체와 끝객체를 지정하여 두 개체를 연결하는 가장 짧은 그래프를 반환하는 메소드
//     *
//     * @param startObejct 그래프 인터페이스를 얻기 위한 첫 번째 개체
//     * @param endObject 그래프 인터페이스를 얻기 위한 두 번째 개체
//     * @return 두 개체를 잇는 트리플을 Jena의 Graph 인터페이스로 반환
//     */
//    public Graph getGraph(Resource startObejct, Resource endObject);

    /**
     * 사용자의 질의로부터 개체 맵핑 및 SPARQL을 생성하여 검색을 수행한 후 그 결과를 출력하기 위한 메소드
     *
     * @param query 사용자 질의문으로써, 기본적인 타겟 클래스는 Media이며 사용자의 질의에 포함된 클래스를 식별하여 타겟 클래스로 지정
     * @return 사용자 질의문에 대한 온톨로지 검색 결과 클래스를 반환
     */
    public OntSearchResults searchLocalOntology(String query);

    /**
     * SMART TV 통합 인터페이스로부터 로컬 온톨로지 검색을 수행하기 위한 검색 메소드
     *
     * @param query 사용자 질의문으로써 타겟 클래스가 식별되었을 경우 타겟 클래스를 제외한 질의문
     * @param targetClass 검색의 대상이 되는 클래스를 문자열 형태로 전달
     * @return 사용자 질의문에 대한 온톨로지 검색 결과 클래스를 반환
     */
    public OntSearchResults searchLocalOntology(String query, String targetClass);

    /**
     * SMART TV 통합 인터페이스로부터 로컬 온톨로지 검색을 수행하기 위한 검색 메소드
     *
     * @param query 사용자 질의문으로써 타겟 클래스가 식별되었을 경우 타겟 클래스를 제외한 질의문
     * @param targetClass 검색의 대상이 되는 클래스를 Jena의 Resource 객체로 전달
     * @return 사용자 질의문에 대한 온톨로지 검색 결과 클래스를 반환
     */
    public OntSearchResults searchLocalOntology(String query, Resource targetClass);
//
//    /**
//     * 재질의 인터페이스를 통해 수정된 Jena의 Graph 인터페이스를 통해 SPARQL을 재생성하여 온톨로지 검색을 수행하기 위한 메소드
//     *
//     * @param queryGraph 재검색을 수행하기 위한 수정된 Jena의 Graph 인터페이스
//     * @return 사용자 질의문에 대한 온톨로지 검색 결과 클래스를 반환
//     */
    public Vector<SearchResultSet> searchLocalOntology(Graph queryGraph);

    /**
     * 주어진 문자열에 대해 온톨로지로부터 개체를 식별하기 위한 메소드
     *
     * @param query 개체 식별을 위한 사용자 질의
     * @return 사용자 질의에 대한 개체식별 결과 클래스를 반환
     */
    public NERResults recognizeNamedEntity(String query);

    /**
     * 주어진 문자열에 대해 온톨로지를 기반으로 개체를 식별하기 위한 메소드
     *
     * @param query 개체 식별을 위한 사용자 질의로써 타겟 클래스가 지정되어 있을 경우 이를 제외한 문자열
     * @param targetClass 주어진 문자열에 대해 개체 식별의 대상이 되는 클래스를 문자열로 지정
     * @return 사용자 질의에 대한 개체식별 결과 클래스를 반환
     */
    public NERResults recognizeNamedEntity(String query, String targetClass);

    /**
     * 주어진 문자열에 대해 온톨로지를 기반으로 개체를 식별하기 위한 메소드
     *
     * @param query 개체 식별을 위한 사용자 질의로써 타겟 클래스가 지정되어 있을 경우 이를 제외한 문자열
     * @param targetClass 주어진 문자열에 대해 개체 식별의 대상이 되는 클래스를 Jena의 Resource 객체로 지정
     * @return 개체 식별 문자열에 대한 결과 클래스
     */
    
    /**
     * added by ETRI
     * 
     * @param ner
     * @return
     */
    public OntSearchResults searchLocalOntology(NERResults ner);
    
    public NERResults recognizeNamedEntity(String query, Resource targetClass);

    public Vector<Query> generateSPARQL(NERResults ner);

    public Vector<SearchResultSet> getSearchResult(Query sparql);
}
